home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Skunkware 5
/
Skunkware 5.iso
/
src
/
X11
/
xtetris-2.5.2
/
score.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-06-09
|
5KB
|
188 lines
#include "defs.h"
#define HIGH_TABLE_SIZE 10 /* size of high score table */
static struct score_table {
char name[80];
int score;
int rows;
int level;
char hostname[80];
char date[80];
} high_scores[HIGH_TABLE_SIZE];
update_highscore_table()
{
/* This version only allows 1 entry in the HIGH SCORE TABLE per user */
int i, j;
long when;
extern char *ctime();
extern long time();
char hostname[BUFSIZ];
char buf[BUFSIZ];
char padname[25];
strcpy( padname, " ");
strncpy( padname, name, strlen(name) ); /* get padded name. */
if (!resources.usescorefile) return;
/* re-read high-score table in case someone else on the network is
* playing at the same time
*/
read_high_scores();
/* Check for previous best score */
for (i = 0; i < HIGH_TABLE_SIZE; i++)
{
if (strcmp(padname, high_scores[i].name) == 0)
break;
}
if (i < HIGH_TABLE_SIZE) {
/*
* We have a previous best score.
*/
if (high_scores[i].score >= score)
return; /* Same/worse score - no update */
for (j = i; j > 0; j--) /* Remove previous best */
high_scores[j] = high_scores[j - 1];
}
/* Next line finds score greater than current one */
for (i = 0;
i < HIGH_TABLE_SIZE && score >= high_scores[i].score;
i++);
i--;
if (i >= 0) {
for (j = 0; j < i; j++)
high_scores[j] = high_scores[j + 1];
strcpy(high_scores[i].name, name);
high_scores[i].score = score;
high_scores[i].rows = rows;
high_scores[i].level = rows / 10;
if (_XGetHostname(hostname, BUFSIZ) == -1)
strncpy(high_scores[i].hostname, "unknown-host",sizeof(high_scores[i].hostname)-1);
else
strncpy(high_scores[i].hostname, hostname,sizeof(high_scores[i].hostname)-1);
high_scores[i].hostname[sizeof(high_scores[i].hostname)-1] = 0;
time(&when);
strncpy(high_scores[i].date, ctime(&when), 24);
high_scores[i].date[24] = 0;
write_high_scores();
}
}
read_high_scores()
{
FILE *fp;
int i;
char buf[BUFSIZ];
if (!resources.usescorefile) return;
if ((fp = fopen(resources.scorefile, "r")) == NULL) {
write_high_scores();
if ((fp = fopen(resources.scorefile, "r")) == NULL) {
resources.usescorefile = False;
fprintf( stderr, "%s: No High score file. Use '-noscore' to avoid this message.\n",
programname );
return;
}
}
for (i = 0; i < HIGH_TABLE_SIZE; i++) {
struct score_table *score = &(high_scores[i]);
if (6 != fscanf( fp, "%20[^,],%7d,%5d,%4d,%12[^,],%24[^,]\n",
score->name,
&score->score,
&score->level,
&score->rows,
score->hostname,
score->date ))
{
strcpy( score->name, "No name" );
strcpy( score->hostname, "No host" );
strcpy( score->date, "No date" );
score->rows = score->score = score->level = 0;
}
}
fclose(fp);
}
write_high_scores()
{
FILE *fp;
int i;
if ((fp = fopen(resources.scorefile, "w")) == NULL) {
fprintf(stderr, "%s: Couldn't open high score file %s\n", programname, resources.scorefile );
return;
}
for (i = 0; i < HIGH_TABLE_SIZE; i++)
fprintf( fp, "%-20s,%7d,%5d,%4d,%-12s,%-24s\n",
high_scores[i].name,
high_scores[i].score,
high_scores[i].level,
high_scores[i].rows,
high_scores[i].hostname,
high_scores[i].date );
fclose(fp);
}
void print_high_scores()
{
int i,j;
static char buf[81*HIGH_TABLE_SIZE+100];
char * start;
int len;
if (!resources.usescorefile) return;
/* re-read high-score table in case someone else on the network is
* playing at the same time */
read_high_scores();
sprintf( buf, "\
Name Score Level Rows Host Date\n\
---- ----- ----- ---- ---- ----\n" );
len = strlen(buf);
start = buf+len;
for (i = HIGH_TABLE_SIZE-1; i >= 0; i--)
{
if (high_scores[i].score != 0)
{
int chars;
sprintf( start, "%-20s %-7d %-5d %-4d %-12s %-24s\n",
high_scores[i].name,
high_scores[i].score,
high_scores[i].level,
high_scores[i].rows,
high_scores[i].hostname,
high_scores[i].date );
chars = strlen(start);
start += chars;
len += chars;
}
}
XtVaSetValues( score_text,
XtNstring, (XtArgVal)buf,
XtNlength, (XtArgVal)len+1, NULL );
XtPopupSpringLoaded(score_frame);
}
/*
emacs mode: indented-text
emacs Local Variables:
emacs mode: c
emacs c-indent-level: 2
emacs c-continued-statement-offset: 2
emacs c-continued-brace-offset: -2
emacs c-tab-always-indent: nil
emacs c-brace-offset: 0
emacs tab-width: 8
emacs tab-stop-list: (2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84)
emacs End:
*/